ThreadLocal底层原理是什么? 您所在的位置:网站首页 my dog by kevin 翻译 ThreadLocal底层原理是什么?

ThreadLocal底层原理是什么?

2023-03-22 11:13| 来源: 网络整理| 查看: 265

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary什么是ThreadLocal

ThreadLocal提供线程的局部变量,这种变量与普通变量的区别在于,每个访问这种变量的线程都有自己的、独立的变量副本。用于解决多线程间的数据隔离问题。

使用场景

其实ThreadLocal在很多开源框架中都有应用:

Spring中的事务管理器,比如TransactionSynchronizationManager等。Mybatis中的ErrorContext类,使用ThreadLocal实现线程安全的单例。存储session中的一些参数,比如用户信息等。API

ThreadLocal提供了4个常用方法:

set()方法,设置当前线程中变量的副本。get()方法,获取 ThreadLocal在当前线程中保存的变量副本。remove()方法,清空当前线程中变量的副本。initialValue()是一个 protected方法,一般是用来重写的,如果在没有set的时候就调用 get,会调用 initialValue方法初始化内容。private static ThreadLocal simpleDateFormatThreadLocal = new ThreadLocal(){ //重写此方法,初始化ThreadLocal的value @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } };原理

那么怎么实现数据隔离的,我们从源码的角度进行分析。

我们先看ThreadLocal类的get()方法。

public T get() { Thread t = Thread.currentThread(); //通过当前线程获取ThreadLocalMap ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); } private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; } //返回Thread实例的成员变量threadLocals ThreadLocalMap getMap(Thread t) { return t.threadLocals; } //给Thread实例的成员变量threadLocals赋值 void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }

从源码可以看出,数据是存在于Thread类的成员变量threadLocals

/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;

上面写了一段注释,翻译过来就是,关于该线程的ThreadLocal的值,由ThreadLocal类进行维护。

所以很清楚了,数据隔离的实现是因为ThreadLocal类操作的是Thread的成员变量threadLocals。每个线程Thread都有自己的threadLocals,从而互相不影响。

threadLocals这个成员变量的本质又是ThreadLocalMap类,它是ThreadLocal的内部类,下面我们研究一下这个内部类的数据结构。

数据结构

先看一下源码:

static class ThreadLocalMap { static class Entry extends WeakReference


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有